package lol.clann.minecraft.springboot.api.service;

import lol.clann.minecraft.springboot.api.model.CacheItem;

import javax.annotation.Nullable;

/**
 * 提供缓存机制
 *
 * 支持不同key不同的过期策略
 *
 * 强制要求key以自己插件ID开头,避免冲突,如 springbootplugin.xxx  taobao.xxx
 *
 * @author pyz
 * @date 2019/6/1 7:00 PM
 */
public interface CacheService {
    /**
     * 强制指定节点失效
     *
     * @param key
     */
    public void invalidate(String key);

    /**
     * 存储一个缓存节点
     * 节点的有效期由CacheItem的参数来指定
     * @param key
     * @param item
     * @param <T>
     */
    public <T> void putCacheItem(String key, CacheItem<T> item);

    /**
     * 获取一个缓存节点,若没有或者已失效,会返回null
     * @param key
     * @param <T>
     * @return
     */
    @Nullable
    public <T> CacheItem<T> getCacheItem(String key);

    /**
     * 直接存入一个数据
     * sbp会将这个数据包装成一个缓存节点,存活时间是永久
     *
     * @param key
     * @param data
     * @param <T>
     */
    public <T> void put(String key, T data);

    /**
     * 获取一个缓存节点的数据,若没有或者已失效,会返回null
     * @param key
     * @param <T>
     * @return
     */
    @Nullable
    public <T> T get(String key);

}
